package com.cskaoyan.javase.oop1._13block._4extend;

/**
 * 类加载 = 加载 + 连接 + 初始化
 * 加载，用来给静态成员变量，进行默认初始，赋默认值
 * 初始化是类加载的最后一个步骤
 *      JVM会执行<clinit>方法
 *      也就是静态成员变量的显式赋值以及静态代码块
 * 类加载，说得更具体一点，实际上是触发类的初始化
 * 类加载的时机，说得更具体一点，实际上是类初始化的时机
 * 当然要想进行类初始化，必须先进行加载和连接
 *
 * 总结：
 *      1.类初始化之前，该类就已经可以使用了。在初始化过程中，可以new对象
 *      2.某个类的类初始化最多触发一次（类加载只有一次）
 *          一旦触发该类的初始化
 *          就不会再次触发类的初始化
 *
 * @since 09:37
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static {
        System.out.println("Demo类开始初始化步骤了!");
    }

    static Cat cat = new Cat();
    Dog dog = new Dog();

    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo d = new Demo();
    }

    public Demo() {
        System.out.println("demo");
    }
}

class Cat {
    static {
        System.out.println("Cat类开始初始化步骤了!");
    }

    static Dog dog = new Dog();

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    static {
        System.out.println("Dog类开始初始化步骤了!");
    }

    static Demo demo = new Demo();

    public Dog() {
        System.out.println("dog");
    }
}